🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / core / navigation / src / commonMain / kotlin / org / meshtastic / core / navigation / DeepLinkRouter.kt
Displaying Raw • Download
core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt 1390a3cd4f7bc55a37433d1d868e65c01678eb31 (1390a3cd) Text, 9.55 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.navigation
Tff7b72import T7ee787androidx.navigation3.runtime.NavKey
Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787org.meshtastic.core.common.util.CommonUri
T8b949e/**
* Type-safe deep link parser for KMP Navigation 3.
*
* Maps an incoming OS intent URI to a list of NavKeys representing the target backstack. This ensures that when a user
* deep links into a detail view, the logical "up" hierarchy is synthesized and correctly populated in the user-owned
* NavBackStack list.
*
* Supports both legacy query-parameter URIs and modern RESTful path patterns:
* - `/nodes` -> List of all nodes
* - `/nodes/{destNum}` -> Node details
* - `/nodes/{destNum}/{metric}` -> Specific node metric (e.g., `/nodes/1234/device-metrics`)
* - `/messages` -> Conversation list
* - `/messages/{contactKey}` -> Specific conversation
* - `/settings` -> Settings root
* - `/settings/{destNum}/{page}` -> Specific settings page for a node
* - `/wifi-provision` -> WiFi provisioning screen
* - `/wifi-provision?address={mac}` -> WiFi provisioning targeting a specific device MAC address
*/
Tff7b72object T56d364DeepLinkRouter Tb4b4b4{
T8b949e/**
* Synthesizes a backstack list from an incoming Meshtastic URI.
*
* @param uri The incoming OS intent URI (e.g. "meshtastic://meshtastic/share?message=hello")
* @return A list of strongly-typed NavKeys representing the backstack, or null if the URI is not recognized.
*/
Tff7b72fun Td2a8ffrouteTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3CommonUriTb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3NavKeyTff7b72>Tff7b72? Tb4b4b4{
Tff7b72val Te6edf3pathSegments Tff7b72= Te6edf3uriTb4b4b4.Te6edf3pathSegmentsTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3pathSegmentsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72null
Tb4b4b4}
Tff7b72val Te6edf3firstSegment Tff7b72= Te6edf3pathSegmentsTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72when Tb4b4b4(Te6edf3firstSegmentTb4b4b4) Tb4b4b4{
Ta5d6ff"Ta5d6ffshareTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmessagesTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffquickchatTa5d6ff"Tb4b4b4,
Tff7b72-Tff7b72> Te6edf3routeContactsTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3pathSegmentsTb4b4b4)
Ta5d6ff"Ta5d6ffconnectionsTa5d6ff" Tff7b72-Tff7b72> Te6edf3listOfTb4b4b4(Te6edf3ConnectionsRouteTb4b4b4.Te6edf3ConnectionsGraphTb4b4b4)
Ta5d6ff"Ta5d6ffmapTa5d6ff" Tff7b72-Tff7b72> Te6edf3routeMapTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3pathSegmentsTb4b4b4)
Ta5d6ff"Ta5d6ffnodesTa5d6ff" Tff7b72-Tff7b72> Te6edf3routeNodesTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3pathSegmentsTb4b4b4)
Ta5d6ff"Ta5d6ffsettingsTa5d6ff" Tff7b72-Tff7b72> Te6edf3routeSettingsTb4b4b4(Te6edf3pathSegmentsTb4b4b4)
Ta5d6ff"Ta5d6ffchannelsTa5d6ff" Tff7b72-Tff7b72> Te6edf3listOfTb4b4b4(Te6edf3ChannelsRouteTb4b4b4.Te6edf3ChannelsGraphTb4b4b4)
Ta5d6ff"Ta5d6fffirmwareTa5d6ff" Tff7b72-Tff7b72> Te6edf3routeFirmwareTb4b4b4(Te6edf3pathSegmentsTb4b4b4)
Ta5d6ff"Ta5d6ffwifi-provisionTa5d6ff" Tff7b72-Tff7b72> Te6edf3routeWifiProvisionTb4b4b4(Te6edf3uriTb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3w Tb4b4b4{ Ta5d6ff"Ta5d6ffUnrecognized deep link segment: Tffd700$Te6edf3firstSegmentTa5d6ff" Tb4b4b4}
Tff7b72null
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffrouteContactsTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3CommonUriTb4b4b4, Te6edf3segmentsTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3NavKeyTff7b72> Tb4b4b4{
Tff7b72val Te6edf3firstSegment Tff7b72= Te6edf3segmentsTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72when Tb4b4b4(Te6edf3firstSegmentTb4b4b4) Tb4b4b4{
Ta5d6ff"Ta5d6ffshareTa5d6ff" Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3message Tff7b72= Te6edf3uriTb4b4b4.Te6edf3getQueryParameterTb4b4b4(Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4) Tff7b72?: Ta5d6ff"Ta5d6ff"
Te6edf3listOfTb4b4b4(Te6edf3ContactsRouteTb4b4b4.Te6edf3ContactsGraphTb4b4b4, Te6edf3ContactsRouteTb4b4b4.Te6edf3ShareTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4)
Tb4b4b4}
Ta5d6ff"Ta5d6ffquickchatTa5d6ff" Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3listOfTb4b4b4(Te6edf3ContactsRouteTb4b4b4.Te6edf3ContactsGraphTb4b4b4, Te6edf3ContactsRouteTb4b4b4.Te6edf3QuickChatTb4b4b4)
Tb4b4b4}
Ta5d6ff"Ta5d6ffmessagesTa5d6ff" Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3contactKey Tff7b72= Tff7b72if Tb4b4b4(Te6edf3segmentsTb4b4b4.Te6edf3size Tff7b72> T79c0ff1Tb4b4b4) Te6edf3segmentsTff7b72[T79c0ff1Tff7b72] Tff7b72else Te6edf3uriTb4b4b4.Te6edf3getQueryParameterTb4b4b4(Ta5d6ff"Ta5d6ffcontactKeyTa5d6ff"Tb4b4b4) Tff7b72?: Ta5d6ff"Ta5d6ff"
Tff7b72val Te6edf3message Tff7b72= Te6edf3uriTb4b4b4.Te6edf3getQueryParameterTb4b4b4(Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4) Tff7b72?: Ta5d6ff"Ta5d6ff"
Tff7b72if Tb4b4b4(Te6edf3contactKeyTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3listOfTb4b4b4(
Te6edf3ContactsRouteTb4b4b4.Te6edf3ContactsGraphTb4b4b4,
Te6edf3ContactsRouteTb4b4b4.Te6edf3MessagesTb4b4b4(Te6edf3contactKey Tff7b72= Te6edf3contactKeyTb4b4b4, Te6edf3message Tff7b72= Te6edf3messageTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3listOfTb4b4b4(Te6edf3ContactsRouteTb4b4b4.Te6edf3ContactsGraphTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72else Tff7b72-Tff7b72> Te6edf3listOfTb4b4b4(Te6edf3ContactsRouteTb4b4b4.Te6edf3ContactsGraphTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffrouteMapTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3CommonUriTb4b4b4, Te6edf3segmentsTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3NavKeyTff7b72> Tb4b4b4{
Tff7b72val Te6edf3waypointIdStr Tff7b72= Tff7b72if Tb4b4b4(Te6edf3segmentsTb4b4b4.Te6edf3size Tff7b72> T79c0ff1Tb4b4b4) Te6edf3segmentsTff7b72[T79c0ff1Tff7b72] Tff7b72else Te6edf3uriTb4b4b4.Te6edf3getQueryParameterTb4b4b4(Ta5d6ff"Ta5d6ffwaypointIdTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3waypointId Tff7b72= Te6edf3waypointIdStrTff7b72?.Te6edf3toIntOrNullTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3listOfTb4b4b4(Te6edf3MapRouteTb4b4b4.Te6edf3MapTb4b4b4(Te6edf3waypointIdTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffrouteNodesTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3CommonUriTb4b4b4, Te6edf3segmentsTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3NavKeyTff7b72> Tb4b4b4{
Tff7b72val Te6edf3destNumStr Tff7b72= Tff7b72if Tb4b4b4(Te6edf3segmentsTb4b4b4.Te6edf3size Tff7b72> T79c0ff1Tb4b4b4) Te6edf3segmentsTff7b72[T79c0ff1Tff7b72] Tff7b72else Te6edf3uriTb4b4b4.Te6edf3getQueryParameterTb4b4b4(Ta5d6ff"Ta5d6ffdestNumTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3destNum Tff7b72= Te6edf3destNumStrTff7b72?.Te6edf3toIntOrNullTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72if Tb4b4b4(Te6edf3destNum Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3listOfTb4b4b4(Te6edf3NodesRouteTb4b4b4.Te6edf3NodesGraphTb4b4b4)
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3segmentsTb4b4b4.Te6edf3size Tff7b72> T79c0ff2Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3subRouteStr Tff7b72= Te6edf3segmentsTff7b72[T79c0ff2Tff7b72]Tb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3detailRouteFn Tff7b72= Te6edf3nodeDetailSubRoutesTff7b72[Te6edf3subRouteStrTff7b72]
Tff7b72if Tb4b4b4(Te6edf3detailRouteFn Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3listOfTb4b4b4(Te6edf3NodesRouteTb4b4b4.Te6edf3NodesGraphTb4b4b4, Te6edf3NodesRouteTb4b4b4.Te6edf3NodeDetailGraphTb4b4b4(Te6edf3destNumTb4b4b4)Tb4b4b4, Te6edf3detailRouteFnTb4b4b4(Te6edf3destNumTb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3listOfTb4b4b4(Te6edf3NodesRouteTb4b4b4.Te6edf3NodesGraphTb4b4b4, Te6edf3NodesRouteTb4b4b4.Te6edf3NodeDetailTb4b4b4(Te6edf3destNumTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3listOfTb4b4b4(Te6edf3NodesRouteTb4b4b4.Te6edf3NodesGraphTb4b4b4, Te6edf3NodesRouteTb4b4b4.Te6edf3NodeDetailTb4b4b4(Te6edf3destNumTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffrouteSettingsTb4b4b4(Te6edf3segmentsTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3NavKeyTff7b72> Tb4b4b4{
Tff7b72var Te6edf3destNumTb4b4b4: Tffa657Int? Tff7b72= Tff7b72null
Tff7b72var Te6edf3subRouteStrTb4b4b4: Tffa657String? Tff7b72= Tff7b72null
Tff7b72if Tb4b4b4(Te6edf3segmentsTb4b4b4.Te6edf3size Tff7b72> T79c0ff1Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3secondSegment Tff7b72= Te6edf3segmentsTff7b72[T79c0ff1Tff7b72]
Tff7b72val Te6edf3parsedNum Tff7b72= Te6edf3secondSegmentTb4b4b4.Te6edf3toIntOrNullTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3parsedNum Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3destNum Tff7b72= Te6edf3parsedNum
Tff7b72if Tb4b4b4(Te6edf3segmentsTb4b4b4.Te6edf3size Tff7b72> T79c0ff2Tb4b4b4) Tb4b4b4{
Te6edf3subRouteStr Tff7b72= Te6edf3segmentsTff7b72[T79c0ff2Tff7b72]Tb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3subRouteStr Tff7b72= Te6edf3secondSegmentTb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3subRouteStr Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3listOfTb4b4b4(Te6edf3SettingsRouteTb4b4b4.Te6edf3SettingsGraphTb4b4b4(Te6edf3destNumTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3subRoute Tff7b72= Te6edf3settingsSubRoutesTff7b72[Te6edf3subRouteStrTff7b72]
Tff7b72return Tff7b72if Tb4b4b4(Te6edf3subRoute Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3listOfTb4b4b4(Te6edf3SettingsRouteTb4b4b4.Te6edf3SettingsGraphTb4b4b4(Te6edf3destNumTb4b4b4)Tb4b4b4, Te6edf3subRouteTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3listOfTb4b4b4(Te6edf3SettingsRouteTb4b4b4.Te6edf3SettingsGraphTb4b4b4(Te6edf3destNumTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffrouteWifiProvisionTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3CommonUriTb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3NavKeyTff7b72> Tb4b4b4{
Tff7b72val Te6edf3address Tff7b72= Te6edf3uriTb4b4b4.Te6edf3getQueryParameterTb4b4b4(Ta5d6ff"Ta5d6ffaddressTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3listOfTb4b4b4(Te6edf3WifiProvisionRouteTb4b4b4.Te6edf3WifiProvisionTb4b4b4(Te6edf3addressTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffrouteFirmwareTb4b4b4(Te6edf3segmentsTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3NavKeyTff7b72> Tb4b4b4{
Tff7b72val Te6edf3update Tff7b72= Tff7b72if Tb4b4b4(Te6edf3segmentsTb4b4b4.Te6edf3size Tff7b72> T79c0ff1Tb4b4b4) Te6edf3segmentsTff7b72[T79c0ff1Tff7b72]Tb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffupdateTa5d6ff" Tff7b72else Tff7b72false
Tff7b72return Tff7b72if Tb4b4b4(Te6edf3updateTb4b4b4) Tb4b4b4{
Te6edf3listOfTb4b4b4(Te6edf3FirmwareRouteTb4b4b4.Te6edf3FirmwareGraphTb4b4b4, Te6edf3FirmwareRouteTb4b4b4.Te6edf3FirmwareUpdateTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3listOfTb4b4b4(Te6edf3FirmwareRouteTb4b4b4.Te6edf3FirmwareGraphTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72val Te6edf3settingsSubRoutesTb4b4b4: Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Te6edf3RouteTff7b72> Tff7b72=
Te6edf3mapOfTb4b4b4(
Ta5d6ff"Ta5d6ffdevice-configTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3DeviceConfigurationTb4b4b4,
Ta5d6ff"Ta5d6ffmodule-configTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3ModuleConfigurationTb4b4b4,
Ta5d6ff"Ta5d6ffadminTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3AdministrationTb4b4b4,
Ta5d6ff"Ta5d6ffuserTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3UserTb4b4b4,
Ta5d6ff"Ta5d6ffchannelTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3ChannelConfigTb4b4b4,
Ta5d6ff"Ta5d6ffdeviceTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3DeviceTb4b4b4,
Ta5d6ff"Ta5d6ffpositionTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3PositionTb4b4b4,
Ta5d6ff"Ta5d6ffpowerTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3PowerTb4b4b4,
Ta5d6ff"Ta5d6ffnetworkTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3NetworkTb4b4b4,
Ta5d6ff"Ta5d6ffdisplayTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3DisplayTb4b4b4,
Ta5d6ff"Ta5d6ffloraTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3LoRaTb4b4b4,
Ta5d6ff"Ta5d6ffbluetoothTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3BluetoothTb4b4b4,
Ta5d6ff"Ta5d6ffsecurityTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3SecurityTb4b4b4,
Ta5d6ff"Ta5d6ffmqttTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3MQTTTb4b4b4,
Ta5d6ff"Ta5d6ffserialTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3SerialTb4b4b4,
Ta5d6ff"Ta5d6ffext-notificationTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3ExtNotificationTb4b4b4,
Ta5d6ff"Ta5d6ffstore-forwardTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3StoreForwardTb4b4b4,
Ta5d6ff"Ta5d6ffrange-testTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3RangeTestTb4b4b4,
Ta5d6ff"Ta5d6fftelemetryTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3TelemetryTb4b4b4,
Ta5d6ff"Ta5d6ffcanned-messageTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3CannedMessageTb4b4b4,
Ta5d6ff"Ta5d6ffaudioTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3AudioTb4b4b4,
Ta5d6ff"Ta5d6ffremote-hardwareTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3RemoteHardwareTb4b4b4,
Ta5d6ff"Ta5d6ffneighbor-infoTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3NeighborInfoTb4b4b4,
Ta5d6ff"Ta5d6ffambient-lightingTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3AmbientLightingTb4b4b4,
Ta5d6ff"Ta5d6ffdetection-sensorTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3DetectionSensorTb4b4b4,
Ta5d6ff"Ta5d6ffpaxcounterTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3PaxcounterTb4b4b4,
Ta5d6ff"Ta5d6ffstatus-messageTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3StatusMessageTb4b4b4,
Ta5d6ff"Ta5d6fftraffic-managementTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3TrafficManagementTb4b4b4,
Ta5d6ff"Ta5d6fftakTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3TAKTb4b4b4,
Ta5d6ff"Ta5d6ffclean-node-dbTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3CleanNodeDbTb4b4b4,
Ta5d6ff"Ta5d6ffdebug-panelTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3DebugPanelTb4b4b4,
Ta5d6ff"Ta5d6ffaboutTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3AboutTb4b4b4,
Ta5d6ff"Ta5d6fffilter-settingsTa5d6ff" Te6edf3to Te6edf3SettingsRouteTb4b4b4.Te6edf3FilterSettingsTb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3nodeDetailSubRoutesTb4b4b4: Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Te6edf3RouteTff7b72> Tff7b72=
Te6edf3mapOfTb4b4b4(
Ta5d6ff"Ta5d6ffdevice-metricsTa5d6ff" Te6edf3to Tb4b4b4{ Te6edf3destNum Tff7b72-Tff7b72> Te6edf3NodeDetailRouteTb4b4b4.Te6edf3DeviceMetricsTb4b4b4(Te6edf3destNumTb4b4b4) Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffmapTa5d6ff" Te6edf3to Tb4b4b4{ Te6edf3destNum Tff7b72-Tff7b72> Te6edf3NodeDetailRouteTb4b4b4.Te6edf3NodeMapTb4b4b4(Te6edf3destNumTb4b4b4) Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffpositionTa5d6ff" Te6edf3to Tb4b4b4{ Te6edf3destNum Tff7b72-Tff7b72> Te6edf3NodeDetailRouteTb4b4b4.Te6edf3PositionLogTb4b4b4(Te6edf3destNumTb4b4b4) Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffenvironmentTa5d6ff" Te6edf3to Tb4b4b4{ Te6edf3destNum Tff7b72-Tff7b72> Te6edf3NodeDetailRouteTb4b4b4.Te6edf3EnvironmentMetricsTb4b4b4(Te6edf3destNumTb4b4b4) Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffsignalTa5d6ff" Te6edf3to Tb4b4b4{ Te6edf3destNum Tff7b72-Tff7b72> Te6edf3NodeDetailRouteTb4b4b4.Te6edf3SignalMetricsTb4b4b4(Te6edf3destNumTb4b4b4) Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffpowerTa5d6ff" Te6edf3to Tb4b4b4{ Te6edf3destNum Tff7b72-Tff7b72> Te6edf3NodeDetailRouteTb4b4b4.Te6edf3PowerMetricsTb4b4b4(Te6edf3destNumTb4b4b4) Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6fftracerouteTa5d6ff" Te6edf3to Tb4b4b4{ Te6edf3destNum Tff7b72-Tff7b72> Te6edf3NodeDetailRouteTb4b4b4.Te6edf3TracerouteLogTb4b4b4(Te6edf3destNumTb4b4b4) Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffhost-metricsTa5d6ff" Te6edf3to Tb4b4b4{ Te6edf3destNum Tff7b72-Tff7b72> Te6edf3NodeDetailRouteTb4b4b4.Te6edf3HostMetricsLogTb4b4b4(Te6edf3destNumTb4b4b4) Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffpaxTa5d6ff" Te6edf3to Tb4b4b4{ Te6edf3destNum Tff7b72-Tff7b72> Te6edf3NodeDetailRouteTb4b4b4.Te6edf3PaxMetricsTb4b4b4(Te6edf3destNumTb4b4b4) Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffneighborsTa5d6ff" Te6edf3to Tb4b4b4{ Te6edf3destNum Tff7b72-Tff7b72> Te6edf3NodeDetailRouteTb4b4b4.Te6edf3NeighborInfoLogTb4b4b4(Te6edf3destNumTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.09s